use serde::{Deserialize, Serialize};
use wither::{
    bson::oid::ObjectId,
    bson::DateTime,
    bson::{doc, Document},
    Model,
};

/// ## 缓存同步库
/// ### 使用
/// 对于任意的`ExpirableCacheData`类型，都应该使用CacheSyncModel同步至数据库中。
/// 数据库自己管理缓存的过期，所以需要提供一个缓存过期时间，
/// 不过如果是`ExpirableCacheData`类型则会自动使用其中的过期时间
/// ## 注意
/// 1. 此类型存在两个id，一个为数据库生成id，一个为缓存生成id (s_id)，使用时注意区分使用
/// 2. mongodb的后台清理线程每1分钟运行一次，也就是说缓存最多会在过期一分钟之后被删除
#[derive(Debug, Clone, Serialize, Deserialize, Model)]
#[model(index(
    keys = r#"doc!{"expired_time":1}"#,
    options = r#"doc!{"expireAfterSeconds":1}"#
))]
pub struct CacheSyncModel {
    #[serde(rename = "_id", skip_serializing_if = "Option::is_none")]
    pub id: Option<ObjectId>,
    pub c_id: String,
    pub value: Document,
    pub expired_time: DateTime,
}

impl Default for CacheSyncModel {
    fn default() -> Self {
        CacheSyncModel {
            id: None,
            c_id: String::new(),
            value: doc! {},
            expired_time: DateTime::now(),
        }
    }
}
